home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CD-ROM Today - The Disc! 5
/
CD-ROM Today - The Disc (Issue 5)(November 1994).ISO
/
mac
/
Mac shareware
/
Education
/
RLaB
/
examples
/
nn-test.r
< prev
next >
Wrap
Text File
|
1994-09-21
|
3KB
|
157 lines
//
// @(#) mail.r
//
// ([{
//
// necessarily global parameters:
// fircoeff
// nfir
// nsaved
// sigsave
// firout
// desired
// iter
// initialize model filter
initfir = function () {
// model filter parameters
// fircoeff = [0.2;-0.4;1;-0.6;0.4]; // model filter coefficients
fircoeff = [1];
nfir = size(fircoeff)[1];
nsaved = 20; // signal delay line length, must
// be >= nfir
rand("default");
sigsave = rand(nsaved, 1); // initialize
}
// model filter time step
stepfir = function () {
// excitation signal generation
rand("default");
// signal = (rand() > 0.5) * 0.8 + 0.1; // exp
// signal = (rand() > 0.5) * 1.8 - 0.9; // tanh
signal = (rand() > 0.5) * 1.8 - 0.9; // simple
// filter update
sigsave = [signal; sigsave[1:(nsaved - 1)]];
firout = sigsave[1:nfir]' * fircoeff;
// nonlinearity
// firout = tanh(3 * firout);
// firout = 2 * sin(3 * firout) + firout;
// noise
rand("normal", 0, 0.1);
firout = firout + rand();
// impulse noise
rand("default");
if (rand() > 0.7) {
firout = firout + 5;
}
// what we would like to adapt to
// desired = firout;
desired = sigsave[3;];
}
bp2init = function () {
// backprop parameters
ninput = 10; // input vector length
input = zeros(ninput, 1); // initialize
ndf = 0; // number of feedback taps
nhidden = 10;
rand("default");
weight1 = (2 * rand(nhidden, ninput ) - 1) * 0.1;
theta1 = (2 * rand(nhidden, 1 ) - 1) * 0.1;
weight2 = (2 * rand(1 , nhidden) - 1) * 0.1;
theta2 = (2 * rand(1 , 1 ) - 1) * 0.1;
mu = 1.0;
// miscellanea
niter = 20000;
skiplimit = 0;
nwsave = niter - skiplimit;
wsave = zeros(nwsave, 5);
esquare = 0;
output = 0; // so that we can shift the first value into input[]
initfir();
}
bp2steps = function (fromiter, toiter, skiplimit) {
for (iter in fromiter:toiter) {
mu = 0.01 * (niter - iter + 1) / niter;
stepfir();
// reconstrunction filter data generation
input = [firout; input[1:(ninput - 1)]];
// forward pass
s1 = weight1 * input + theta1;
hidden = s1 ./ (1 + abs(s1)); // simple
s2 = weight2 * hidden + theta2;
output = s2 ./ (1 + abs(s2)); // simple
// error vectors
e2 = (mu * (1 ./ ((1 + abs(s2)) .* (1 + abs(s2))) + 0.05)) .* (desired - output); // simple
e1 = (1 ./ ((1 + abs(s1)) .* (1 + abs(s1))) + 0.05) .* (weight2' * e2); // simple
// weight update
weight1 = weight1 + e1 * input';
weight2 = weight2 + e2 * hidden';
// threshold update
theta1 = theta1 + e1;
theta2 = theta2 + e2;
err = desired - output;
esquare = 0.995 * esquare + 0.005 * (err' * err);
if (iter > skiplimit) {
wsave[(iter - skiplimit);] = [desired, firout, output, err, esquare];
}
}
}
bp2 = function () {
iter = 1;
toiter = 0;
while (iter < niter) {
fromiter = toiter + 1;
toiter = fromiter + 999;
if (toiter > niter) {
toiter = niter;
}
bp2steps(fromiter, toiter, skiplimit);
printf("Iteration %d: esquare = %g,\n", iter, esquare);
printf(" weight1^2 = %g, theta1^2 = %g,\n", trace(weight1 * weight1'), theta1' * theta1);
printf(" weight2^2 = %g, theta2^2 = %g\n", weight2 * weight2', theta2' * theta2);
}
plotdata = [((skiplimit + 1):niter)', wsave];
plgrid();
ptitle ( "RLaB Neural Net Example (contributed)" );
xlabel ( "" );
ylabel ( "" );
plot(plotdata[nwsave-100:nwsave;]);
}
// }])